上一篇提到響應式的概念, 為了更能理解響應式編程, 這篇將使用 Swift 基本語法來介紹.
在 Swift 中, 可以使用 computed variable, 來相對產生資料:
var value:Int = ...
var description: String {"\(value)"}
這個範例中, value
是一個可變變數, description
是一個唯讀的變數(非常數).
由於這是比較節約的語法, 拓展之後如下:
var description: String
{
get
{
return "\(value)"
}
}
雖然有 computed variable, 可以讓相同物件的屬性之間有相依關係, 但是在實際應用上, 我們常常需要讓不同物件可以共同對事件變化, 這時可以用 didSet
的方式來延伸事件的影響範圍.
var source = 1
var associated = 2
{
didSet
{
source = associated
}
}
或是在函式執行的尾聲, 透過 clousure
的方式延伸事件:
func add(left:Int,
right:Int,
onComplete:(Int)->Void)
{
let result = left + right
onComplete(result)
}
add(left: 1, right:2)
{
returnValue:Int in
print(returnValue) // 3
}
在我們使用 Combine 之前, 若是需要將 add 的 result 再次執行兩次時, 會這樣處理:
add (left:1, right: 2)
{
returnValue in
add(left: returnValue, right: 2)
{
returnValue2 in
add(left: returnValue2, right: 2)
{
print(returnValue2) // 7
}
}
}
而使用 Combine 之後, 則可以改寫為:
import Combine
func add(left:Int,
right:Int) -> Int
{
return left + right
}
let aStream:AnyCancellable =
Just(1)
.map{add(left:$0,right:2)}
.map{add(left:$0,right:2)}
.map{add(left:$0,right:2)}
.sink{print($0)} // 7
若是想要減少 add 的次數, 只需要註解或刪除 .map
即可.
簡單測驗:
func getData(from: URL)throws -> (URLResponse, Data)
whoami:
我是游諭 ytyubox